<?php
namespace app\common\redis;

use app\common\driver\cache\Redis;
use app\common\library\CommonFun;
use app\common\redis\traits\HashTrait;
use app\common\redis\traits\SortSetTrait;
use app\common\redis\traits\ListTrait;
use app\common\redis\traits\SetTrait;
use app\common\redis\traits\StrTrait;

/**
 * Redis 模型基类
 * @App	
 * @Group 
 * @Action RedisModel
 * @author lilei
 * @date 2018年5月23日
 *
 */

class RedisModel {
    use HashTrait;
	use SortSetTrait;
	use ListTrait;
	use SetTrait;
    use StrTrait;

	/**
	 * Redis配置名称
	 * @var string
	 */
	public $redis = 'default';
	
	/**
	 *  Redis key 
	 */
	public $key_prefix = '';
	
	/**
	 * Redis key
	 * @var string
	 */
	public $key = '';
	
	/**
	 * 数据信息
	 * @var array
	 */
	public $data = array();
	
	/**
	 * Redis 操作句柄
	 * @var \Redis|Redis
	 */
	public $redis_handle ;
	
	
	/**
	 * 构造方法
	 * @param string $config redis 配置名称
	 */
	public function __construct( $config='' ) {
		if ( $config ) {
			$this->redis = $config;
		}
		// 执行初始化函数
		$this->_initialize();
		// 初始化Redis 连接句柄
		$this->redis_handle = CommonFun::get_redis($this->redis);
	}

    /**
     *
     */
	protected function _initialize() {}
	
	/**
	 * 返回单例模型
	 * @return static
	 */
	public static function getInstance() {
		$param = func_get_args ();
		return CommonFun::get_instance_of ( get_called_class (), '', $param );
	}
	
	/**
	 * 设置数据对象的值
	 * @access public
	 * @param string $name 名称
	 * @param mixed $value 值
	 * @return void
	 */
	public function __set($name,$value) {
		// 设置数据对象属性
		$this->data[$name]  =   $value;
	}
	
	/**
	 * 获取数据对象的值
	 * @access public
	 * @param string $name 名称
	 * @return mixed
	 */
	public function __get($name) {
		return isset($this->data[$name])?$this->data[$name]:null;
	}
	
	/**
	 * 检测数据对象的值
	 * @access public
	 * @param string $name 名称
	 * @return boolean
	 */
	public function __isset($name) {
		return isset($this->data[$name]);
	}
	
	/**
	 * 销毁数据对象的值
	 * @access public
	 * @param string $name 名称
	 * @return void
	 */
	public function __unset($name) {
		unset($this->data[$name]);
	}

    /**
     * 设置Redis的Key
     * @param string $suffix key标识|后缀
     * @return string
     */
	public function SetRedisKey( $suffix ) {
		$this->key = $this->key_prefix.":".$suffix;
		return $this->key;
	}
	
	/**
	 * 开启管道
	 */
	public function PipeStart() {
		$this->redis_handle->pipeline();
	}
	
	/**
	 * 执行管道
	 */
	public function PipeExec() {
		return $this->redis_handle->exec();
	}

    /**
     * 删除指定key的值
     * @param string $key
     * @return int
     */
	public function Delete( $key='' ) {
		$_key = $key ?: $this->key;
		$res = $this->redis_handle->delete($_key);
		return $res;
	}
	
	/**
	 * 判断指定的Key是否存在
	 * @param string $key
	 * @return bool
	 */
	public function ExistsKey( $key='' ) {
		$_key = $key ?: $this->key;
		$res = $this->redis_handle->exists($_key);
		return $res;
	}
	
	
	
	
	
}